package com.heima.wemedia.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.heima.apis.article.IArticleClient;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.wemedia.dtos.StatisticsDto;
import com.heima.model.wemedia.pojos.WmNews;
import com.heima.model.wemedia.pojos.WmUser;
import com.heima.utils.common.DateUtils;
import com.heima.utils.thread.WmThreadLocalUtil;
import com.heima.wemedia.service.WmNewsService;
import com.heima.wemedia.service.WmStatisticsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;


@Service
@Slf4j
@Transactional
public class WmStatisticsServiceImpl implements WmStatisticsService {

    @Autowired
    private WmNewsService wmNewsService;

    @Autowired
    private IArticleClient articleClient;

    /**
     * 图文统计(自媒体人登录到自媒体系统后可以查看最近的统计报表)
     * 展示当前时间范围内的具体文章阅读、评论、收藏的数量
     * @param beginDate
     * @param endDate
     * @return
     */
    @Override
    public ResponseResult newsDimension(String beginDate, String endDate) {
        log.info("查询当前时间范围内的具体文章阅读、评论、收藏的数量，时间范围：{}", beginDate + "~" + endDate);
        Map<String, Object> resultMap = new HashMap<>();

        //类型转换   字符串转换为date类型
        Date beginDateTime = DateUtils.stringToDate(beginDate);
        Date endDateTime = DateUtils.stringToDate(endDate);


        WmUser user = WmThreadLocalUtil.getUser();

        //图文发布量
//        int publishNum = wmNewsService.count(Wrappers.<WmNews>lambdaQuery()
//                .eq(WmNews::getUserId, user.getId())
//                .eq(WmNews::getStatus, WmNews.Status.PUBLISHED.getCode())
//                .eq(WmNews::getEnable, 1)
//                .between(WmNews::getPublishTime, beginDateTime, endDateTime));
//        resultMap.put("publishNum", publishNum);

        //点赞数量&收藏数量，responseResult不一定是返回到前端，而是返回给自媒体系统，自媒体系统再返回给前端
        ResponseResult responseResult = articleClient.queryLikesAndConllections
                (user.getId(), beginDateTime, endDateTime);
        //请求成功
        if (responseResult.getCode().equals(200)) {
            //将 responseResult 中的数据部分（通过 getData() 方法获取）转换为JSON格式的字符串，
            // 并赋值给 res_json。JSON.toJSONString() 是通常用于将对象序列化为JSON字符串的方法。
            String res_json = JSON.toJSONString(responseResult.getData());
            //将前面生成的 JSON 字符串 res_json 解析回一个 Map 对象。
            // 这样，map 就包含了从 responseResult 中提取的数据，其中每一个键值对对应原数据的字段。
            Map map = JSON.parseObject(res_json, Map.class);
//将 map 中的 "likes" 值放入 resultMap，键为 "likesNum"。
//如果 map.get("likes") 为 null，则默认值为0；否则，就直接使用 map.get("likes") 的值。
            //文章点赞量
            resultMap.put("likesNum", map.get("likes") == null ? 0 : map.get("likes"));
//将 map 中的 "collections" 值放入 resultMap，键为 "collectNum"，同样处理 null 值的情况。
            //文章收藏量
            resultMap.put("collectNum", map.get("collections") == null ? 0 : map.get("collections"));
            //图片发布量
            resultMap.put("publishNum", map.get("newsCount") == null ? 0 : map.get("newsCount"));
        }

        return ResponseResult.okResult(resultMap);
    }

    /**
     * 分页查询图文统计
     * (分页展示文章列表，展示当前时间范围内的具体文章阅读、评论、收藏的数量。)
     * @param dto
     * @return
     */
    @Override
    public PageResponseResult newsPage(StatisticsDto dto) {
        log.info("分页查询图文统计，参数：{}", JSON.toJSONString(dto));
        WmUser user = WmThreadLocalUtil.getUser();
        dto.setWmUserId(user.getId());
        PageResponseResult responseResult = articleClient.newPage(dto);
        return responseResult;
    }
}
